home *** CD-ROM | disk | FTP | other *** search
/ The Atari Compendium / The Atari Compendium (Toad Computers) (1994).iso / files / prgtools / c / egem_210 / sgem201c / demo / demo.c < prev    next >
Encoding:
C/C++ Source or Header  |  1995-11-25  |  20.8 KB  |  486 lines

  1. /* ------------------------------------------------------------------- *
  2.  * Module Version       : 2.00                                         *
  3.  * Author               : Andrea Pietsch                               *
  4.  * Programming Language : Pure-C                                       *
  5.  * Copyright            : (c) 1994, Andrea Pietsch, 56727 Mayen        *
  6.  * ------------------------------------------------------------------- */
  7.  
  8. #include        <sys_gem2.h>
  9. #include        <string.h>
  10. #include        "rsc_3d.h"
  11.  
  12. /* ------------------------------------------------------------------- */
  13.  
  14. OBJECT  *rsc_button;                    /* Baum-Adresse                */
  15. OBJECT  *rsc_reiter;                    /* Baum-Adresse                */
  16. OBJECT  *rsc_rahmen1;                   /* Baum-Adresse                */
  17. OBJECT  *rsc_rahmen2;                   /* Baum-Adresse                */
  18. OBJECT  *rsc_boxchar;                   /* Baum-Adresse                */
  19. OBJECT  *rsc_text;                      /* Baum-Adresse                */
  20. OBJECT  *rsc_frame;                     /* Baum-Adresse                */
  21. OBJECT  *rsc_menu;                      /* Baum-Adresse                */
  22. OBJECT  *rsc_main;                      /* Baum-Adresse                */
  23. OBJECT  *rsc_info;                      /* Baum-Adresse                */
  24. OBJECT  *rsc_icon;                      /* Baum-Adresse                */
  25.  
  26. /* ------------------------------------------------------------------- */
  27.  
  28. BYTE    slider_buffer   [20][30];
  29.  
  30. /* -------------------------------------------------------------------
  31.  * HandleDemo
  32.  *
  33.  * Erledigt die Verwaltung der "Reiter" und zeigt die verschiedenen
  34.  * Erweiterten Typen an, die SysGem so drauf hat...
  35.  * ------------------------------------------------------------------- */
  36.  
  37. INT HandleObjects ( INT msg, INT button, DIALOG_INFO *inf )
  38.  
  39. {
  40.   switch ( msg )
  41.     {
  42.       case SG_START    : /* ------------------------------------------
  43.                           * Voreinstellungen
  44.                           * ------------------------------------------ */
  45.  
  46.                          SetText ( rsc_text, TE_EDTEXT, "Ein kleiner Test" );
  47.                          break;
  48.  
  49.       case SG_END      : /* ------------------------------------------
  50.                           * Fenster schließen
  51.                           * ------------------------------------------ */
  52.  
  53.                          switch ( button )
  54.                            {
  55.                              case -1     : return ( SG_CLOSE );
  56.                              default     : break;
  57.                            }
  58.                          break;
  59.  
  60.       case SG_HELP     : /* ------------------------------------------
  61.                           * User hat HELP gedrückt oder auf den HILFE-
  62.                           * Button geklickt
  63.                           * ------------------------------------------ */
  64.  
  65.                          Alert ( ALERT_NORM, 1, "[3][ Noch keine Hilfe verfügbar! ][   [OK   ]" );
  66.                          break;
  67.  
  68.       case SG_NEWDIAL  : /* ------------------------------------------
  69.                           * Je nachdem, welcher Reiter angewählt wurde,
  70.                           * wird hier der richtige Dialog dazu einge-
  71.                           * tragen
  72.                           * ------------------------------------------ */
  73.  
  74.                          switch ( button )
  75.                            {
  76.                              case RE_BUTTON1  : inf->tree = rsc_button;   break;
  77.                              case RE_RAHMEN1  : inf->tree = rsc_rahmen1;  break;
  78.                              case RE_RAHMEN2  : inf->tree = rsc_rahmen2;  break;
  79.                              case RE_BOXCHAR  : inf->tree = rsc_boxchar;  break;
  80.                              case RE_TEXT     : inf->tree = rsc_text;     break;
  81.                              case RE_FRAME    : inf->tree = rsc_frame;    break;
  82.                              default          : return ( SG_CONT );
  83.                            }
  84.                          return ( SG_TAKEDIAL );
  85.       default          : break;
  86.     }
  87.   return ( SG_CONT );
  88. }
  89.  
  90. /* -------------------------------------------------------------------
  91.  * HandleMenuLine
  92.  *
  93.  * Reagiert auf Clicks in die Menüzeile
  94.  * ------------------------------------------------------------------- */
  95.  
  96. INT HandleMenuLine ( INT item )
  97.  
  98. {
  99.   switch ( item )
  100.     {
  101.       case -1           : /* -----------------------------------------
  102.                            * User hat die HELP-Taste gedrückt
  103.                            * ----------------------------------------- */
  104.                          Alert ( ALERT_NORM, 1, "[3][ Noch keine Hilfe verfügbar! ][   [OK   ]" );
  105.                          break;
  106.  
  107.       case ME_INFO      : /* -----------------------------------------
  108.                            * Info darstellen
  109.                            * ----------------------------------------- */
  110.                           DoDialog ( rsc_info, 0, "|Programm-Info" );
  111.                           break;
  112.  
  113.       case ME_ENDE      : /* -----------------------------------------
  114.                            * Programm beenden
  115.                            * ----------------------------------------- */
  116.                           return ( SG_TERM );
  117.  
  118.       case ME_WECHSELN  : /* -----------------------------------------
  119.                            * Fenster wechseln ohne Auswahl
  120.                            * ----------------------------------------- */
  121.                           CycleWindow ( FALSE );
  122.                           break;
  123.  
  124.       case ME_WECHSELN2 : /* -----------------------------------------
  125.                            * Fenster wechseln mit Auswahl
  126.                            * ----------------------------------------- */
  127.                           CycleWindow ( TRUE );
  128.                           break;
  129.  
  130.       case ME_FONT      : /* -----------------------------------------
  131.                            * Font wählen
  132.                            * ----------------------------------------- */
  133.  
  134.                           FontSelect ( NULL, NULL, "Zeichensatz", "", FALSE );
  135.                           break;
  136.  
  137.       default           : break;
  138.     }
  139.   return ( SG_CONT );
  140. }
  141.  
  142. /* ------------------------------------------------------------------- */
  143.  
  144. INT HandleWindow ( INT msg, WINDOW_INFO *inf )
  145.  
  146. {
  147.   LOCAL INT     line    = -1;
  148.  
  149.   switch ( msg )
  150.     {
  151.       case SG_END       : /* -----------------------------------------
  152.                            * Fenster schließen
  153.                            * ----------------------------------------- */
  154.  
  155.                           line = -1;
  156.                           return ( SG_CLOSE );
  157.       case SG_LCLICK1   :
  158.       case SG_LCLICK2   : /* -----------------------------------------
  159.                            * Zeile selektieren - wenn schon eine Zeile
  160.                            * selektiert ist, deselektieren
  161.                            * ----------------------------------------- */
  162.  
  163.                           if ( line != -1 )
  164.                             {
  165.                               SetLineFlags ( inf->id, line, 0 );
  166.                               RedrawLine   ( inf->id, line );
  167.                               line = -1;
  168.                             }
  169.                           if ( inf->line >= 0L )
  170.                             {
  171.                               line = (UINT) inf->line;
  172.                               SetLineFlags ( inf->id, line, 1 );
  173.                               RedrawLine   ( inf->id, line );
  174.                             }
  175.                           break;
  176.     }
  177.   return ( SG_CONT );
  178. }
  179.  
  180. /* -------------------------------------------------------------------
  181.  * Normales Textfenster mit 100 Zeilen Text darstellen
  182.  *
  183.  * Das Redraw der Textzeilen wird - wie auch das Scrollen - von SysGem
  184.  * automatisch übernommen
  185.  * ------------------------------------------------------------------- */
  186.  
  187. VOID MakeWindow1 ( VOID )
  188.  
  189. {
  190.   INT   i;
  191.   BYTE  str [100];
  192.  
  193.   /* -----------------------------------------------------------------
  194.    * Fenster öffnen
  195.    * ----------------------------------------------------------------- */
  196.  
  197.   if ( OpenWindow ( 'norm', "|Textfenster", "", 0xfef, NULL, 8, TRUE, -1, -1, 1L, 1L, 40, 40, 300, 280, NULL, (RPROC) NULL, HandleWindow ) < 0 )
  198.     {
  199.       return;
  200.     }
  201.  
  202.   /* -----------------------------------------------------------------
  203.    * Die Liste aus Textzeilen erzeugen und ins Fenster 'linken'...
  204.    * ----------------------------------------------------------------- */
  205.  
  206.   BeginListUpdate ( 'norm' );
  207.   for ( i = 0; i < 100; i++ )
  208.     {
  209.       sprintf ( str, " Eine kleine Testzeile Nr. %3d zur Demonstration ", i + 1 );
  210.       AddToList ( 'norm', str );
  211.     }
  212.  
  213.   /* -----------------------------------------------------------------
  214.    * Textfenster neu berechnen und wenn nötig, neuzeichnen
  215.    * ----------------------------------------------------------------- */
  216.  
  217.   EndListUpdate ( 'norm' );
  218. }
  219.  
  220. /* -------------------------------------------------------------------
  221.  * Textfenster mit 20 Objektbäumen als Zeilen darstellen
  222.  * Zum Ausrichten der Zeilen werden zwei Tabulatoren verwendet
  223.  *
  224.  * Das Redraw der Bäume wird - wie auch das Scrollen - von SysGem
  225.  * automatisch übernommen
  226.  * ------------------------------------------------------------------- */
  227.  
  228. VOID MakeWindow2 ( VOID )
  229.  
  230. {
  231.   INT   i;
  232.   BYTE  str [100];
  233.  
  234.   /* -----------------------------------------------------------------
  235.    * Fenster öffnen, wie oben auch...
  236.    * ----------------------------------------------------------------- */
  237.  
  238.   if ( OpenWindow ( 'nor2', "|Textfenster", "", NAME | MOVER | CLOSER | UPARROW | DNARROW | VSLIDE, NULL, 8, FALSE, -1, -1, 1L, 1L, 40, 40, 300, 230, NULL, (RPROC) NULL, HandleWindow ) < 0 )
  239.     {
  240.       return;
  241.     }
  242.  
  243.   /* -----------------------------------------------------------------
  244.    * Die Liste aus Textzeilen erzeugen und ins Fenster 'linken'...
  245.    * Ebenso werden die beiden Tabulatoren für das Fenster eingestellt
  246.    * ----------------------------------------------------------------- */
  247.  
  248.   BeginListUpdate ( 'nor2' );
  249.   SetListTab ( 'nor2',  7, TAB_LEFT );
  250.   SetListTab ( 'nor2', 28, TAB_RIGHT );
  251.   for ( i = 0; i < 20; i++ )
  252.     {
  253.       sprintf     ( str, "\tEine Testzeile Nr.\t%d", i + 1 );
  254.       AddToList   ( 'nor2', str );
  255.       SetLineIcon ( 'nor2', i, rsc_icon, IC_BOX );
  256.     }
  257.  
  258.   /* -----------------------------------------------------------------
  259.    * Textfenster neu berechnen und wenn nötig, neuzeichnen
  260.    * ----------------------------------------------------------------- */
  261.  
  262.   EndListUpdate ( 'nor2' );
  263. }
  264.  
  265. /* ------------------------------------------------------------------- */
  266.  
  267. INT HandleMain ( INT msg, INT button, DIALOG_INFO *inf )
  268.  
  269. {
  270.   UINT  i;
  271.  
  272.   switch ( msg )
  273.     {
  274.       case SG_START    : /* ------------------------------------------
  275.                           * Sliderbox vorbelegen und Textfelder löschen
  276.                           * ------------------------------------------ */
  277.  
  278.                          for ( i = 0; i < 20; i++ )
  279.                            {
  280.                              sprintf ( slider_buffer [i], "*----+\tTestzeile Nr. %3d", i + 1 );
  281.                              slider_buffer [i][0] = 255;
  282.                              slider_buffer [i][1] = (BYTE)((LONG)( rsc_icon ) >> 24 );
  283.                              slider_buffer [i][2] = (BYTE)((LONG)( rsc_icon ) >> 16 );
  284.                              slider_buffer [i][3] = (BYTE)((LONG)( rsc_icon ) >>  8 );
  285.                              slider_buffer [i][4] = (BYTE)((LONG)( rsc_icon ) >>  0 );
  286.                              slider_buffer [i][5] = (BYTE) IC_BAR;
  287.                            }
  288.                          LinkSlider    ( rsc_main, MA_UP, MA_DN, MA_SHOW, MA_HIDE, 20, MA_BOX, &slider_buffer [0][0], 30, TRUE );
  289.                          SetSliderTab  ( rsc_main, MA_BOX, 5, TAB_LEFT );
  290.                          SelectSldItem ( rsc_main, MA_BOX, 0, FALSE );
  291.  
  292.                          ClearEditFields ( rsc_main );
  293.                          break;
  294.  
  295.       case SG_SLIDER   : /* ------------------------------------------
  296.                           * Eintrag in der Sliderbox, die angeklickt
  297.                           * wurde, selektieren
  298.                           * ------------------------------------------ */
  299.  
  300.                          if ( button >= 0 ) /* War ein 'echter' Eintrag*/
  301.                            {
  302.                              SelectSldItem ( rsc_main, MA_BOX, button, TRUE );
  303.                            }
  304.                          break;
  305.  
  306.       case SG_END      : /* ------------------------------------------
  307.                           * Button auswerten, der angeklickt wurde
  308.                           * ------------------------------------------ */
  309.  
  310.                          switch ( button )
  311.                            {
  312.                              case -1        : /* Closer angeklickt     */
  313.                              case MA_EXIT   : /* ---------------------
  314.                                                * Fragen, ob beenden
  315.                                                * --------------------- */
  316.                                               if ( Alert ( ALERT_NORM, 1, "[2][ Wirklich beenden? ][ [Ja | [Nein ]" ) == 1 )
  317.                                                 {
  318.                                                   return ( SG_TERM );
  319.                                                 }
  320.                                               break;
  321.  
  322.                              case MA_LIST   : /* ---------------------
  323.                                                * Listbox
  324.                                                * --------------------- */
  325.                                               Listbox ( " Dieses       | ist          | eine         | Listbox      | in           | der          | beliebig     |"
  326.                                                         " viele        | Zeilen       | untergebracht| werden       | können       ", -1, -1, rsc_main, MA_LIST );
  327.                                               break;
  328.  
  329.                              case MA_OBJECT : /* ---------------------
  330.                                                * Erweiterte Objekte
  331.                                                * darstellen
  332.                                                * --------------------- */
  333.                                               MultipleDialog ( 'xobj', -1, -1, "|Objekttypen", "", rsc_reiter, RE_BUTTON1, rsc_button, -2, NULL, HandleObjects );
  334.                                               break;
  335.  
  336.                              case MA_WINDOW : /* ---------------------
  337.                                                * Textfenster zeigen
  338.                                                * --------------------- */
  339.                                               MakeWindow1 ();
  340.                                               break;
  341.  
  342.                              case MA_ICONS  : /* ---------------------
  343.                                                * Iconfenster zeigen
  344.                                                * --------------------- */
  345.                                               MakeWindow2 ();
  346.                                               break;
  347.  
  348.                              default        : break;
  349.                            }
  350.                          break;
  351.       case SG_HELP     : /* ------------------------------------------
  352.                           * User hat HELP gedrückt oder auf den HILFE-
  353.                           * Button geklickt
  354.                           * ------------------------------------------ */
  355.  
  356.                          Alert ( ALERT_NORM, 1, "[3][ Noch keine Hilfe verfügbar! ][   [OK   ]" );
  357.                          break;
  358.  
  359.       case SG_DRAGDROP : /* ------------------------------------------
  360.                           * Irgendwas wurde ins Fenster gezogen
  361.                           * laden wir's doch einfach mal...
  362.                           * Wenn Fenster schon offen, Fenster schließen
  363.                           * ------------------------------------------ */
  364.  
  365.                          CloseWindowById ( 'file' );
  366.  
  367.                          i = (UINT) Display ( inf->dd->data, "|Datei", inf->dd->data, 250, 'file', 30, 30, 300, 250, (APROC) NULL );
  368.  
  369.                          /* ------------------------------------------
  370.                           * Protokollieren, welche Datei geladen wurde
  371.                           *
  372.                           * Wenn Log-Fenster schon offen
  373.                           * ------------------------------------------ */
  374.  
  375.                          if ( GetHandle ( 'xlog' ) == -1 )
  376.                            {
  377.                              OpenLogWindow ( 'xlog', "|Drag & Drop Aktionen", "", 60, 12, 50, 50, (APROC) NULL );
  378.                            }
  379.                          wprintf ( 'xlog', "\nDatei: %s  [%u Zeilen]", inf->dd->data, i );
  380.                          break;
  381.       default          : break;
  382.     }
  383.   return ( SG_CONT );
  384. }
  385.  
  386. /* ------------------------------------------------------------------- */
  387.  
  388. INT main ( VOID )
  389.  
  390. {
  391.   /* -----------------------------------------------------------------
  392.    * Initialisieren...
  393.    * ----------------------------------------------------------------- */
  394.  
  395.   if ( InitGem ( "", 'demo', "Demo" ) > 0 )
  396.     {
  397.       UseWindowSlider ();
  398.       UseOwnEditFields ();
  399.       SetKey ( 0L, 0L );
  400.  
  401.       /* -------------------------------------------------------------
  402.        * Resource laden - eine normale, da keine Farbicons drin sind
  403.        * wenn Farbicons, dann C_ICON.PRG in den Auto-Ordner und FALSE
  404.        * auf TRUE setzen...
  405.        * ------------------------------------------------------------- */
  406.  
  407.       if ( LoadResource ( "DEMO.RSC", FALSE ) >= 0 )
  408.         {
  409.           /* ---------------------------------------------------------
  410.            * Dialog-Adressen ermitteln
  411.            * --------------------------------------------------------- */
  412.  
  413.           rsc_button    = RscAdr ( R_TREE, BUTTONS  );
  414.           rsc_reiter    = RscAdr ( R_TREE, REITER   );
  415.           rsc_rahmen1   = RscAdr ( R_TREE, RAHMEN1  );
  416.           rsc_rahmen2   = RscAdr ( R_TREE, RAHMEN2  );
  417.           rsc_boxchar   = RscAdr ( R_TREE, BOXCHARS );
  418.           rsc_text      = RscAdr ( R_TREE, TEXTE    );
  419.           rsc_frame     = RscAdr ( R_TREE, FRAME    );
  420.           rsc_menu      = RscAdr ( R_TREE, MENUE    );
  421.           rsc_main      = RscAdr ( R_TREE, MAIN     );
  422.           rsc_info      = RscAdr ( R_TREE, SGINFO   );
  423.           rsc_icon      = RscAdr ( R_TREE, ICONS    );
  424.  
  425.           /* ---------------------------------------------------------
  426.            * Dialoge anmelden
  427.            * --------------------------------------------------------- */
  428.  
  429.           NewDialog ( rsc_button  );
  430.           NewDialog ( rsc_reiter  );
  431.           NewDialog ( rsc_rahmen1 );
  432.           NewDialog ( rsc_rahmen2 );
  433.           NewDialog ( rsc_boxchar );
  434.           NewDialog ( rsc_text    );
  435.           NewDialog ( rsc_frame   );
  436.           NewDialog ( rsc_main    );
  437.           NewDialog ( rsc_info    );
  438.           NewDialog ( rsc_icon    );
  439.  
  440.           /* ---------------------------------------------------------
  441.            * Menüzeile anmelden und darstellen
  442.            * --------------------------------------------------------- */
  443.  
  444.           InitMenuLine   ( rsc_menu );
  445.           SetDeskTopMenu ( rsc_menu, HandleMenuLine );
  446.  
  447.           /* ---------------------------------------------------------
  448.            * Logfenster öffnen
  449.            * --------------------------------------------------------- */
  450.  
  451.           OpenLogWindow ( 'xlog', "|Drag & Drop Aktionen", "", 60, 12, 50, 50, (APROC) NULL );
  452.           wprintf ( 'xlog', "Keine geladenen Dateien..." );
  453.  
  454.           /* ---------------------------------------------------------
  455.            * Hauptdialog öffnen
  456.            * --------------------------------------------------------- */
  457.  
  458.           if ( WindowDialog ( 'main', -1, -1, "|SysGem-Demo", "", TRUE, FALSE, rsc_main, NULL, -2, NULL, HandleMain ))
  459.             {
  460.               /* -----------------------------------------------------
  461.                * Die Kontrolle an SysGem abgeben...
  462.                * ----------------------------------------------------- */
  463.  
  464.               HandleSysGem ();
  465.             }
  466.         }
  467.       else
  468.         {
  469.           /* ---------------------------------------------------------
  470.            * Resource-Laden ist schiefgelaufen
  471.            * --------------------------------------------------------- */
  472.  
  473.           Alert ( ALERT_NORM, 1, "[3][ Resource-Datei nicht gefunden! ][ [Abbruch ]" );
  474.         }
  475.  
  476.       /* -------------------------------------------------------------
  477.        * ...und wieder abmelden
  478.        * ------------------------------------------------------------- */
  479.  
  480.       ExitGem ();
  481.     }
  482.   return ( 0 );
  483. }
  484.  
  485. /* ------------------------------------------------------------------- */
  486.